一、Nginx 緩存模塊簡介
Nginx 主要通過以下兩個模塊實現緩存:
?
ngx_http_proxy_module
:反向代理功能,用于轉發請求到后端服務器。ngx_http_cache_module
:緩存模塊,用于存儲后端響應結果。
?
核心原理:Nginx 作為反向代理,第一次請求后端服務器時,將響應內容緩存到本地磁盤 / 內存;后續相同請求直接返回緩存內容,無需再次訪問后端。
二、配置步驟
1. 準備工作
-
檢查模塊支持:
確認 Nginx 已編譯包含?proxy
?和?cache
?模塊。執行以下命令:bash?????nginx -V 2>&1 | grep -E "proxy|cache"
?輸出中應包含?--with-http_proxy_module
?和?--with-http_cache_module
。- 若未包含,需重新編譯 Nginx(參考?Nginx 官方文檔)。
-
創建緩存目錄:bash?????
sudo mkdir -p /var/cache/nginx/cache # 路徑可自定義 sudo chown -R nginx:nginx /var/cache/nginx # 設置權限(用戶需與 Nginx 運行用戶一致)
?
2. 全局緩存配置(http 塊)
在 Nginx 配置文件(通常為?
/etc/nginx/nginx.conf
)的?http
?塊中,定義緩存區域和策略:?
nginx
?
?
?
?
?
http {
# 定義緩存區域(levels、keys_zone、max_size 為必填項)
proxy_cache_path /var/cache/nginx/cache # 緩存存儲路徑
levels=1:2 # 緩存目錄層級(1:2 表示兩層目錄,如 /a/b/cache_key)
keys_zone=my_cache:10m # 緩存鍵共享內存區(名稱:大小,10m 表示占用 10MB 內存)
max_size=10g # 緩存最大磁盤占用(超過后按策略淘汰)
inactive=60m # 緩存項在指定時間內未被訪問則刪除(60分鐘)
use_temp_path=on; # 是否使用臨時路徑緩存(默認 on,建議保留)
# 其他全局配置(如 MIME 類型、日志等)...
}
?
?
關鍵參數說明:
?
參數 | 說明 |
---|---|
levels |
緩存目錄層級,用于分散文件存儲,避免單目錄文件過多(建議 1:2 或 2:2)。 |
keys_zone |
緩存鍵的元數據存儲區,內存大小需根據緩存鍵數量調整(1MB 約存儲 8000 個鍵)。 |
max_size |
緩存總大小,超過后按?proxy_cache_use_stale ?策略淘汰舊緩存。 |
inactive |
緩存項未被訪問的超時時間,超時后自動刪除(僅在內存中標記,磁盤空間延遲釋放)。 |
use_temp_path |
是否使用臨時目錄緩存數據(建議開啟,避免緩存寫入過程中返回不完整數據)。 |
3. 反向代理緩存配置(server/location 塊)
在具體的?
server
?或?location
?塊中,啟用緩存并關聯到后端服務器:?
nginx
?
?
?
?
?
server {
listen 80;
server_name example.com;
location / {
# 反向代理到后端服務器(如 Node.js、PHP-FPM 等)
proxy_pass http://backend_server; # 后端地址,如 http://127.0.0.1:8080
# 啟用緩存并關聯全局緩存區域
proxy_cache my_cache; # 使用 http 塊中定義的 keys_zone 名稱(my_cache)
proxy_cache_key $scheme$host$request_uri; # 緩存鍵規則(基于協議、域名、URI)
# 緩存有效期配置(按響應狀態碼設置不同緩存時間)
proxy_cache_valid 200 302 12h; # 成功響應(200/302)緩存 12 小時
proxy_cache_valid 404 1m; # 404 錯誤緩存 1 分鐘
proxy_cache_valid any 5m; # 其他狀態碼默認緩存 5 分鐘(可選)
# 緩存更新策略
proxy_cache_use_stale updating; # 緩存過期時,返回舊緩存并后臺更新
proxy_cache_background_update on; # 后臺異步更新緩存(需 Nginx 1.13.9+)
# 忽略后端返回的 Cache-Control 頭,強制使用 Nginx 配置
proxy_ignore_headers Cache-Control;
# 傳遞必要的請求頭(如 Cookie,按需開啟)
proxy_pass_request_cookie on;
}
}
?
?
關鍵參數說明:
?
proxy_cache_key
:定義緩存鍵的生成規則,需確保相同請求生成唯一鍵。常見變量:$scheme
:協議(http/https)。$host
:域名(避免不同域名共享緩存)。$request_uri
:完整 URI(包含查詢參數,如??id=123
)。- 若需排除查詢參數,可改為?
$uri
(僅路徑部分)。
proxy_cache_valid
:按狀態碼設置不同緩存時間,any
?表示所有狀態碼。proxy_cache_use_stale
:緩存過期時的處理策略,updating
?表示使用舊緩存并觸發更新。
4. 高級配置:緩存分層與控制
-
按請求頭緩存(如區分用戶登錄狀態):nginx?????
location / { # 僅緩存未登錄用戶的請求(通過 Cookie 判斷) if ($http_cookie !~* "logged_in=1") { proxy_cache my_cache; } }
? -
禁止緩存特定請求(如帶授權頭):nginx?????
location / { if ($http_authorization) { proxy_no_cache 1; # 禁止緩存帶 Authorization 頭的請求 add_header Cache-Control "no-cache, no-store"; } }
? -
緩存分層(內存 + 磁盤):nginx?????
proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m loader_files=1000 # 啟動時一次性加載的緩存元數據文件數 loader_sleep=200ms # 加載間隔 loader_threshold=300m; # 加載閾值(超過則分批次加載)
?
三、緩存管理與監控
1. 查看緩存狀態
在?
location
?塊中添加?proxy_cache_status
?變量,返回緩存狀態:?
nginx
?
?
?
?
?
location / {
# 其他配置...
add_header X-Cache $proxy_cache_status; # 響應頭中添加緩存狀態
}
?
?
狀態值說明:
?
HIT
:緩存命中,直接返回緩存內容。MISS
:緩存未命中,請求后端服務器并緩存結果。EXPIRED
:緩存過期,請求后端服務器并更新緩存。STALE
:使用舊緩存(proxy_cache_use_stale
?生效時)。
?
示例響應頭:
?
http
?
?
?
?
?
X-Cache: HIT
?
2. 清理緩存
Nginx 本身不提供內置緩存清理接口,需借助第三方模塊或腳本:
?
-
方法一:使用?
ngx_http_cache_purge
?模塊(需編譯時添加):- 重新編譯 Nginx 并啟用模塊:
bash?????
./configure --add-module=/path/to/ngx_http_cache_purge make && make install
? - 配置清理接口:
nginx?????
location /purge { allow 127.0.0.1; # 允許清理的 IP deny all; proxy_cache_purge my_cache $scheme$host$request_uri; # 按緩存鍵清理 }
?
發送?POST
?請求到?/purge?uri=/path/to/clear
?即可刪除對應緩存。
- 重新編譯 Nginx 并啟用模塊:
-
方法二:手動刪除緩存文件:bash?????
# 按緩存鍵哈希值刪除(需先計算鍵的哈希值) key_hash=$(echo -n "$scheme$host$request_uri" | md5sum | cut -c1-2)/$(echo -n "$scheme$host$request_uri" | md5sum | cut -c3-4)/$(echo -n "$scheme$host$request_uri" | md5sum) rm -f /var/cache/nginx/cache/$key_hash
?
3. 監控緩存命中率
通過 Nginx 日志或外部工具監控緩存命中情況:
?
-
在日志中記錄緩存狀態:
修改?nginx.conf
?中的日志格式:nginx?????log_format cache_log '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$proxy_cache_status"'; access_log /var/log/nginx/access.log cache_log;
?日志中會顯示每行請求的?$proxy_cache_status
?值,通過統計?HIT
?與?MISS
?的比例計算命中率。 -
使用第三方工具:
- Prometheus + Nginx Exporter:監控 Nginx 指標(如緩存命中數)。
- Grafana:可視化緩存命中率趨勢。
四、最佳實踐與注意事項
1. 緩存策略優化
-
區分動態與靜態內容:
- 靜態資源(如圖片、CSS)優先通過瀏覽器緩存(
Cache-Control: max-age=31536000
)處理,減少 Nginx 緩存壓力。 - 動態內容(如 API 接口)使用 Nginx 反向代理緩存,設置合理過期時間(如 5-30 分鐘)。
- 靜態資源(如圖片、CSS)優先通過瀏覽器緩存(
-
避免緩存敏感數據:
對包含用戶認證信息(如 Cookie、Authorization 頭)的請求,禁用緩存(proxy_no_cache 1
)。 -
熱點數據預熱:
通過腳本提前請求熱點 URL,將數據載入緩存(如啟動時執行?curl -I http://example.com/hot-path
)。
2. 性能調優
-
調整內存與磁盤占用:
keys_zone
?大小:根據預估的緩存鍵數量調整(1MB ≈ 8000 鍵),避免頻繁內存回收。max_size
:根據服務器磁盤空間設置,建議為后端數據總量的 1-3 倍。
-
啟用 Sendfile 加速:nginx?????
http { sendfile on; tcp_nopush on; }
?減少內核空間與用戶空間的數據拷貝,提升靜態文件傳輸效率。
3. 高可用性架構
- 緩存服務器集群:
將 Nginx 緩存節點獨立部署為集群,避免單機緩存失效影響全局。 - 后端服務器健康檢查:
結合?proxy_next_upstream
?實現故障轉移:nginx?????proxy_next_upstream error timeout invalid_header http_500;
?
五、示例配置文件
nginx
?
?
?
?
?
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
http {
include mime.types;
default_type application/octet-stream;
# 全局緩存配置
proxy_cache_path /var/cache/nginx/cache
levels=1:2
keys_zone=my_cache:20m
max_size=20g
inactive=30m
use_temp_path=on;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 后端服務器組(需在 http 塊中定義 upstream)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 緩存配置
proxy_cache my_cache;
proxy_cache_key $scheme$host$uri$is_args$args; # 包含查詢參數
proxy_cache_valid 200 302 6h;
proxy_cache_valid 404 10m;
add_header X-Cache $proxy_cache_status;
# 禁止緩存帶 Cookie 的請求
if ($http_cookie ~* "sessionid") {
proxy_no_cache 1;
add_header Cache-Control "no-cache";
}
}
}
# 后端服務器組
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
}
?
六、常見問題排查
-
緩存未生效(始終返回 MISS)
- 檢查?
proxy_cache
?是否啟用(是否關聯到正確的?keys_zone
)。 - 確認?
proxy_cache_key
?是否包含必要變量(如?$host
?避免跨域名緩存污染)。 - 查看響應頭是否有?
Cache-Control: no-cache
(可能被后端或 Nginx 配置覆蓋)。
- 檢查?
-
緩存數據不一致
- 確保后端數據更新時,通過接口清理對應緩存(如調用?
/purge
?接口)。 - 檢查?
inactive
?時間是否過長,導致舊數據未被及時刪除。
- 確保后端數據更新時,通過接口清理對應緩存(如調用?
-
磁盤空間不足
- 調整?
max_size
?或?inactive
?時間,釋放過期緩存。 - 啟用?
proxy_cache_use_stale error timeout
,在后端故障時繼續返回舊緩存。
- 調整?
?
通過以上配置,Nginx 可高效實現服務器端緩存,顯著提升網站性能和后端負載能力。實際應用中需結合業務場景動態調整緩存策略,并定期監控緩存命中率和資源占用。
文章鏈接: http://m.qzkangyuan.com/36341.html
文章標題:如何利用Nginx進行服務器端緩存配置?
文章版權:夢飛科技所發布的內容,部分為原創文章,轉載請注明來源,網絡轉載文章如有侵權請聯系我們!
聲明:本站所有文章,如無特殊說明或標注,均為本站原創發布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發布本站內容到任何網站、書籍等各類媒體平臺。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。